Vaultに対してHTTPアクセスをしてみる
VaultにHTTPでアクセスしましょう
この記事では、Vaultのdevサーバを起動してアクセスしてみました。
ですが、devサーバはあくまでもテスト用なので、本番環境で使用することはできません。
今回は通常のサーバを起動し、外部からHTTPでアクセスしてみましょう。
Vaultセットアップ〜HTTPでアクセスできるまで
1.EC2インスタンスにVaultとConsulをインストール
今回は外部からアクセスするので、EC2を使用します。t1.microでかまわないので、Amazon Linuxで起動しましょう。
セキュリティグループは、sshと後で使用する8200番ポートをあけておきます。
次に、必要なソフトをEC2にダウンロードします。
ここからConsul(分散環境のサービス変更と設定ツール)を、
そして、ここからVaultをダウンロードします。
※64bit Linux用
wgetでConsulとVaultをダウンロードするか、ローカルにダウンロードしてscpでアップロードしてもOKです。
% scp -i <sshキー> <アップロードするファイルパス> ec2-user@<サーバのアドレス>:~
sshでEC2にログインしましょう。
% ssh -i <sshキー> ec2-user@<サーバのアドレス>
EC2にログインしたら、ConsulとVaultのzipを解凍し、パスのとおった場所に移動させます。
vaultコマンドとconsulコマンドが実行できれば準備OKです。
2.サーバの起動
今回はConsulをbackendにするため、consul agentを起動しておきます。
% consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul
3.設定ファイルを作成
次は、Vaultの設定ファイルを「seerver.hcl」という名前で作成します。下記のように記述してください。
backend "consul" { advertise_addr = "http://<サーバのIP>:8200" } listener "tcp" { address = "0.0.0.0:8200" tls_disable = 1 }
advertise_addrには、他のVaultからアクセスする際の自分のアドレスを記述し、
listenerのaddressにはVaultの待ち受けアドレスとポートを指定します。
また、tls_disableに値を設定した場合、HTTP接続になります。
4.Vaultサーバ起動
では、Vaultサーバを起動しましょう。vault serverコマンドで、さきほどの設定ファイルを指定します。
% vault server -config ./server.hcl ==> Vault server configuration: Log Level: info Mlock: supported: true, enabled: true Backend: consul (HA available) Advertise Address: http://<ip>:8200 Listener 1: tcp (addr: "0.0.0.0:8200", tls: "disabled")
なお、vault serverコマンドを実行した際、下記のようなエラーが表示されるかもしれません。
Error initializing core: failed to lock memory: cannot allocate memory ・ ・
その際には、次のコマンドを実行し、mlockシステムコールを許可してあげる必要があるようです。
% sudo setcap cap_ipc_lock=+ep $(readlink -f $(which vault))
5.Vaultの初期化
サーバが起動したら、コンソールでアクセスしてみます。
VAULT_ADDRを下記のように設定しましょう。
% export VAULT_ADDR='http://127.0.0.1:8200'
そして、vault initコマンドで初期化を行います。
% vault init Key 1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Key 2: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Key 3: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Key 4: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Key 5: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Initial Root Token: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
これを実行すると、5つのKeyとInitial Root Tokenが表示されます。
これは非常に重要なので、なくさないようにしてください。(アクセスできなくなります)
6.unsealeする
では、httpでアクセスしてみましょう。
http://<サーバのip>:8200/v1/secret/foo
とブラウザで入力すると、下記のように表示されます。
{"errors":["Vault is sealed"]}
アクセスに失敗してしまいました。
Vaultサーバは初期状態ではseale状態になっているので、unseale作業をしてあげなければいけません。
vault unsealコマンドを実行し、さきほどのkeyを入力します。この作業を3回行うことで、Vaultにアクセス可能になります。
(この回数はvault init時の-key-thresholdオプションにて変更可能)
% vault unseal ・ ・
7.トークン発行
さて、再度httpアクセスしてみます。すると今度は次のようなメッセージが表示されました。
{"errors":["missing client token"]}
どうやらトークンがないといわれているようなので、トークンを発行してあげましょう。
まずはトークン発行時に指定できる、ポリシーファイルを「acl.hcl」という名前で作成します。
path "secret/*" { policy = "write" } path "secret/foo" { policy = "read" }
これは、「secret以下は保存可能かつsecret/fooは取得のみ」というポリシーになります。
ポリシーファイルをつくったら、vault authでルート化し、テストデータの登録とポリシーの適用を行いましょう。
% vault auth <Root Token> //root化 % vault write secret/foo value=hello //とりあえずテスト値登録 % vault policy-write secret acl.hcl //ポリシー適用 Policy 'secret' written.
では、トークンを発行をしてみましょう。vault token-createでトークンを発行しています。
ここでは、さきほどのポリシーの適用と共に、いくつかオプションを指定しています。
% vault token-create -lease="1h" -use-limit=1 -policy="secret" Key Value token <発行されたトークン> token_duration 3600 token_renewable true token_policies [secret]
leaseは有効期限で、このトークンは1時間だけ有効になります。
また、use-limitはトークンを使用できる回数で、1回限り有効になっています。
8.HTTPアクセスしてみる
では、先ほど発行されたトークンをつかってhttpアクセスしてみます。
DHCとかのツールを使い、ヘッダーに
X-Vault-Token: <発行されたトークン>
を指定して、
http://<サーバのip>:8200/v1/secret/foo
にアクセスしてみてください。
1回目は下記のような感じでデータが返ってくるはずです。
{ "lease_id": "secret/foo/xxxxxxxxxxxxxxxxx", "renewable": false, "lease_duration": 2592000, "data":{ "value": "hello" }, "auth": null }
しかし、もう一度リクエストをおくってみると、403エラーになります。
このように、トークンに有効期限や回数を指定できるので、用途に応じて安全にトークンを発行できます。
まとめ
今回はVaultサーバでのポリシー設定やトークン発行を行い、httpアクセスを試してみました。
これ以外にもAWSのIAMを発行したりとかいろいろできるので、試してみたいと思います。